package br.com.cast.UseCaseProdutos.notaFiscal.paginas;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.util.ListModel;
import org.apache.wicket.spring.injection.annot.SpringBean;

import br.com.cast.UseCaseProdutos.HomePage;
import br.com.cast.UseCaseProdutos.excecoes.NotaFiscalJaCadastrada;
import br.com.cast.UseCaseProdutos.models.NotaFiscal;
import br.com.cast.UseCaseProdutos.models.Produto;
import br.com.cast.UseCaseProdutos.services.INotaFiscalService;
import br.com.cast.UseCaseProdutos.services.IProdutoService;
import br.com.cast.UseCaseProdutos.util.ComponentUtil;

public class FormNotaFiscal extends Form<NotaFiscal> {

	private static final long serialVersionUID = 1L;

	@SpringBean
	private INotaFiscalService iNotaFiscalService;

	@SpringBean
	private IProdutoService iProdutoService;

	private Produto produtoSelecionado;

	private ListView<Produto> listView;
	
	private WebMarkupContainer panelGrade;

	public FormNotaFiscal(String id) {
		super(id);

		setDefaultModel(new CompoundPropertyModel<NotaFiscal>(new NotaFiscal()));

		criaCampoNumero();

		criaComboProduto();

		criaLinkCancelar();

		criaListView();

		criaBotaoSalvar();
	}

	private void criaBotaoSalvar() {
		add(new AjaxButton("salvar") {
			private static final long serialVersionUID = 1L;

			@Override
			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
				HomePage template = ComponentUtil.getTemplate(this);

				try {
					iNotaFiscalService.salvar(FormNotaFiscal.this.getModelObject());
					redirecionaListar(target, template);
					template.success("Registro inserido com sucesso!");
				} catch (NotaFiscalJaCadastrada e) {
					error(e.getMessage());
				}

				target.add(template.get("msgErro"));
				target.add(template.get("msgSucesso"));

			}

			@Override
			protected void onError(AjaxRequestTarget target, Form<?> form) {
				HomePage template = ComponentUtil.getTemplate(this);
				target.add(template.get("msgErro"));
				target.add(template.get("msgSucesso"));
			}

		});

	}

	private void criaListView() {

		panelGrade = new WebMarkupContainer("panelGrade");
		panelGrade.setOutputMarkupId(true);

		listView = new ListView<Produto>("produtosNF",
				getModelObject().getProdutos()) {
			private static final long serialVersionUID = 1L;

			@Override
			protected void populateItem(final ListItem<Produto> item) {

				final Produto p = (Produto) item.getDefaultModelObject();

				// para linhas impares adiciona um estilo diferente.
				if (item.getIndex() % 2 != 0) {// o indice começa no zero
					item.add(AttributeModifier.replace("class", "alt"));
				}

				item.add(new Label("descricao", p.getDescricao()));

				item.add(new Label("valor", p.getValor()));
				
				item.add(new AjaxLink<Void>("excluir") {
					private static final long serialVersionUID = 1L;

					@Override
					public void onClick(AjaxRequestTarget target) {
						FormNotaFiscal.this.getModelObject().getProdutos().remove(p);
						target.add(panelGrade);
					}

				});

			}

		};

		listView.setOutputMarkupId(true);

		panelGrade.add(listView);

		add(panelGrade);

	}

	private void criaCampoNumero() {
		add(new RequiredTextField<>("numero"));
	}

	private void criaComboProduto() {
		IChoiceRenderer<Produto> renderer = new ChoiceRenderer<>("descricao");

		ListModel<Produto> model = new ListModel<>(
				iProdutoService.consultaTodos());

		final DropDownChoice<Produto> produto = new DropDownChoice<Produto>(
				"produtos", new PropertyModel<Produto>(this,
						"produtoSelecionado"), model, renderer);

		produto.add(new AjaxFormComponentUpdatingBehavior("change") {
			private static final long serialVersionUID = 1L;

			
			@Override
			protected void onUpdate(AjaxRequestTarget target) {
				/*
				 * 
				 * Verificar erro
				 * 
				 */				
				FormNotaFiscal template = (FormNotaFiscal) this.getComponent().getParent();

				if (produtoSelecionado == null)
					return;
				else if (FormNotaFiscal.this.getModelObject().getProdutos().contains(produtoSelecionado)){
					template.error("Produto já existe na lista");
					return;
				}else {
					getModelObject().getProdutos().add(produtoSelecionado);
					target.add(panelGrade);
				}
			}
		});

		add(produto);
	}

	private void criaLinkCancelar() {
		add(new AjaxLink<Object>("cancelar") {
			private static final long serialVersionUID = 1L;

			@Override
			public void onClick(AjaxRequestTarget target) {
				HomePage template = ComponentUtil.getTemplate(this);
				redirecionaListar(target, template);
			}
		});
	}

	private void redirecionaListar(AjaxRequestTarget target, HomePage template) {
		ListarNotaFiscal listar = new ListarNotaFiscal(HomePage.ID_CONTEUDO);
		template.replace(listar);
		target.add(listar);
	}

	protected void atualizaLista(){
		listView.setList(getModelObject().getProdutos());
	}
	
}
